package cn.iocoder.yudao.module.shop.admin.service;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.shop.admin.pojo.po.ShopUser;
import cn.iocoder.yudao.module.shop.admin.pojo.vo.ShopUserCreateReqVO;
import cn.iocoder.yudao.module.shop.admin.pojo.vo.ShopUserPageReqVO;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import jakarta.validation.Valid;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 店铺商户 Service 实现类
 *
 * @author 山野羡民（1032694760@qq.com）
 */
public interface ShopUserService {

    /**
     * 创建店铺商户，如果不存在，则创建
     *
     * @param shopId   店铺编号
     * @param userId   前台用户编号
     * @param nickname 后台管理员昵称
     * @param username 后台管理员用户名
     * @return 后台管理员用户编号
     */
    Long createAdminIfNecessary(Long shopId, Long userId, String nickname, String username);

    /**
     * 创建店铺商户
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createAdmin(@Valid ShopUserCreateReqVO createReqVO);

    /**
     * 删除店铺商户
     *
     * @param id 编号
     */
    void deleteAdmin(Long id);

    /**
     * 获得店铺商户
     *
     * @param id 编号
     * @return 店铺商户
     */
    ShopUser getAdmin(Long id);

    /**
     * 获得店铺商户分页
     *
     * @param pageReqVO 分页查询
     * @return 店铺商户分页
     */
    PageResult<ShopUser> getAdminPage(ShopUserPageReqVO pageReqVO);

    /**
     * 根据用户编号获取店铺编号
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @return 店铺编号的数组
     */
    @Nonnull
    default Set<Long> getShopIdsByUserId(Long userId, Integer userType) {
        List<ShopUser> list = getAdminListByUserId(userId, userType);
        if (CollUtil.isEmpty(list)) {
            return CollUtil.newHashSet();
        }
        return list.stream().map(ShopUser::getShopId).collect(Collectors.toSet());
    }

    /**
     * 根据用户编号获取店铺编号
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @return 店铺编号的数组
     */
    @Nullable
    default Long getLastShopIdByUserId(Long userId, Integer userType) {
        ShopUser shopUserDO = getLastAdminByUserId(userId, userType);
        if (shopUserDO == null) {
            return null;
        }
        return shopUserDO.getShopId();
    }

    /**
     * 根据用户编号获取店铺商户信息
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @return 店铺商户信息
     */
    List<ShopUser> getAdminListByUserId(Long userId, Integer userType);

    /**
     * 根据用户编号获取店铺商户信息
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @return 店铺商户信息
     */
    @Nullable
    default ShopUser getLastAdminByUserId(Long userId, Integer userType) {
        List<ShopUser> list = getAdminListByUserId(userId, userType);
        if (CollUtil.isEmpty(list)) {
            return null;
        }
        return list.get(0);
    }

    /**
     * 根据店铺编号获取管理员列表
     *
     * @param shopId   店铺编号
     * @return 管理员列表
     */
    @Nullable
    List<ShopUser> getAdminListByShopId(Long shopId);

    /**
     * 获取店铺商户
     *
     * @param shopId 店铺编号
     * @param userId   用户编号
     * @param userType 用户类型 {@link UserTypeEnum}
     * @return 店铺商户信息
     */
    @Nullable
    ShopUser getAdmin(Long shopId, Long userId, Integer userType);

}
